/** str.replace(regexp|substr, newSubStr|function) */
/* https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace
该方法并不改变调用它的字符串本身，而只是返回一个新的替换后的字符串。

在进行全局的搜索替换时，正则表达式需包含 g 标志。


regexp (pattern)
一个RegExp 对象或者其字面量。该正则所匹配的内容会被第二个参数的返回值替换掉。

substr (pattern)
一个将被 newSubStr 替换的 字符串。其被视为一整个字符串，而不是一个正则表达式。仅第一个匹配项会被替换。

newSubStr (replacement)
用于替换掉第一个参数在原字符串中的匹配部分的字符串。该字符串中可以内插一些特殊的变量名。参考下面的使用字符串作为参数。

function (replacement)
一个用来创建新子字符串的函数，该函数的返回值将替换掉第一个参数匹配到的结果。参考下面的指定一个函数作为参数。


变量名	   代表的值
$$	     插入一个 "$"。
$&	     插入匹配的子串。
$`	     插入当前匹配的子串左边的内容。
$'	     插入当前匹配的子串右边的内容。
$n       假如第一个参数是 RegExp对象，并且 n 是个小于100的非负整数，那么插入第 n 个括号匹配的字符串。提示：索引是从1开始。如果不存在第 n个分组，那么将会把匹配到到内容替换为字面量。比如不存在第3个分组，就会用“$3”替换匹配到的内容。

$<Name>	 这里Name 是一个分组名称。如果在正则表达式中并不存在分组（或者没有匹配），这个变量将被处理为空字符串。只有在支持命名分组捕获的浏览器中才能使用。
*/

/** 1. 非全局 只会替换第一个*/
const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?';
console.log(p.replace('dog', 'monkey'));
// expected output: "The quick brown fox jumps over the lazy monkey. If the dog reacted, was it really lazy?"

const regex = /Dog/i;
console.log(p.replace(regex, 'ferret'));
// expected output: "The quick brown fox jumps over the lazy ferret. If the dog reacted, was it really lazy?"




/*
指定一个函数作为参数
你可以指定一个函数作为第二个参数。
在这种情况下，当匹配执行后，该函数就会执行。
函数的返回值作为替换字符串。 (注意：上面提到的特殊替换参数在这里不能被使用。)
另外要注意的是，如果第一个参数是正则表达式，并且其为全局匹配模式，那么这个方法将被多次调用，每次匹配都会被调用。
下面是该函数的参数：

变量名	               代表的值
match	            匹配的子串。（对应于上述的$&。）
p1,p2, ...	      假如replace()方法的第一个参数是一个RegExp 对象，则代表第n个括号匹配的字符串。（对应于上述的$1，$2等。）例如，如果是用 /(\a+)(\b+)/ 这个来匹配，p1 就是匹配的 \a+，p2 就是匹配的 \b+。
offset	          匹配到的子字符串在原字符串中的偏移量。（比如，如果原字符串是 'abcd'，匹配到的子字符串是 'bc'，那么这个参数将会是 1）
string	          被匹配的原字符串。
NamedCaptureGroup	命名捕获组匹配的对象

精确的参数个数依赖于 replace() 的第一个参数是否是一个正则表达式（RegExp）对象，以及这个正则表达式中指定了多少个括号子串，如果这个正则表达式里使用了命名捕获， 还会添加一个命名捕获的对象)

下面的例子将会使 newString 变成 'abc - 12345 - #$*%'：
*/
function replacer(match, p1, p2, p3, offset, string) {
  console.log('match:',match); //match: abc12345#$*%
  console.log('offset:',offset); //offset: 0
  // p1 is nondigits, p2 digits, and p3 non-alphanumerics
  return [p1, p2, p3].join(' - ');
}
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
console.log(newString);  // abc - 12345 - #$*%



//会将 '[00:02.120]只是对你有些厌倦' 中的 [00:02.120] 都踢掉
console.log('[00:02.120]只是对你有些厌倦'.replace(/\[(\d{2,}):(\d{2})(?:[\.\:](\d{2,3}))?]/g, ''));
console.log(/\[(\d{2,}):(\d{2})(?:[\.\:](\d{2,3}))?]/g.exec('[00:02.120]只是对你有些厌倦'));


//下面的例子演示了如何交换一个字符串中两个单词的位置，这个脚本使用$1 和 $2 代替替换文本。
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
// Smith, John
console.log(newstr);


//运行 styleHyphenFormat('borderTop')，将返回 'border-top'。
function styleHyphenFormat(propertyName) {
  function upperToHyphenLower(match) {
    return '-' + match.toLowerCase();
  }
  return propertyName.replace(/[A-Z]/g, upperToHyphenLower);
}

console.log(styleHyphenFormat('borderTop'));


//将华氏温度转换为对等的摄氏温度
function f2c(x)
{
  function convert(str, p1, offset, s)
  {
    return ((p1-32) * 5/9) + "C";
  }
  var s = String(x);
  var test = /(\d+(?:\.\d*)?)F\b/g;
  return s.replace(test, convert);
}

console.log(f2c('212F')); //100C
